package com.example.application.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect // 当前类是一个切面
@Component
public class UserAspect {
    // 定义一个切点（设置拦截规则）
    @Pointcut("execution(* com.example.application.controller.UserController.*(..))")
    public void pointcut() {
        System.out.println("PointCut被执行");
    }

    // 定义 pointcut 切点的前置通知
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行@Before前置通知");
    }


    // 返回之后通知
    @AfterReturning("pointcut()")
    public void doAfterReturning() {
        System.out.println("执行@AfterReturning返回之后通知");
    }

    
    // 后置通知
    @After("pointcut()")
    public void doAfter() {
        System.out.println("执行@After后置通知");
    }
    
    // 抛出异常之后通知
    @AfterThrowing("pointcut()")
    public void doAfterThrowing() {
        System.out.println("执行@AfterThrowing抛出异常之后通知");
    }

    // 环绕通知
    // @Around("pointcut()") //在被通知的方法调用之前和调用之后执行自定义的逻辑。
    // public void doAround(){
    //     System.out.println("执行@Around环绕通知");
    // }
}
